package demo.gf.datasource;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;


/**
 * @author : GuoFei
 * @date : 2019/4/29 15:39
 */
@Slf4j
public class TestMain {

    private static MyDataSource dataSource = null;

    public static void main(String[] args) {
        List<OrderPostInfo> orderPostInfos = new ArrayList<>();
        OrderPostInfo od1 = new OrderPostInfo("998998","测试1","-1");
        OrderPostInfo od2 = new OrderPostInfo("998998","测试1","-2");
        OrderPostInfo od3 = new OrderPostInfo("998998","测试1","-3");
        orderPostInfos.add(od1);
        orderPostInfos.add(od2);
        orderPostInfos.add(od3);
        updateOrderPostInfoFroBatch(orderPostInfos);
    }

    public static void updateOrderPostInfoFroBatch(List<OrderPostInfo> orderPostInfos){
        String headSql = "UPDATE payorder SET PostNum = temp_a.postNum, logistics = temp_a.logistics FROM (select data.*,ii.orderNum from ( ";
        StringBuilder baseSql = new StringBuilder();
        baseSql.append("  SELECT '0' postNum, '0' logistics, '0' newOrderNum  ");
        orderPostInfos.forEach(s->
                baseSql.append(" UNION ALL SELECT  '").append(s.getPostNum()).append("' , '").append(s.getLogistics()).append("' , '").append(s.getNewOrderNum()).append("' ")
        );
        String tailSql = ") data join payorderimportitem ii on ii.newOrderNum = data.newOrderNum ) temp_a where [payorder].OrderNum = temp_a.orderNum";
        String resSql = headSql + baseSql.toString() + tailSql;
        System.out.println(resSql);
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    static class OrderPostInfo{
        String postNum;
        String logistics;
        String newOrderNum;
    }

//    public static void main(String[] args) {
//        log.info("ceshi log");
//        showInfo();
//        initDataSource();
//        try {
//            getData(dataSource.getConnection());
//            Thread.sleep(2000);
//            getData(dataSource.getConnection());
//            Thread.sleep(2000);
//            getData(dataSource.getConnection());
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    private static void infoDataSource() {
//        System.out.println("-------------------info begin--------------------");
//        if (dataSource != null) {
//            List info = Arrays.asList(
//                    dataSource.getVersion(),
//                    dataSource.getActiveCount()
//            );
//            info.forEach(System.out::println);
//        }
//        System.out.println("-------------------info  end --------------------");
//    }
//
//    private static void initDataSource() {
//        if (dataSource == null) {
//            dataSource = new MyDataSource();
//            try {
//                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//            } catch (ClassNotFoundException e) {
//                e.printStackTrace();
////                log.info("数据库驱动类加载有误,请检查");
//                throw new MySQLException("数据库驱动类加载有误,请检查");
//            }
//            dataSource.setUrl("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=learn_server");
//            dataSource.setUsername("sa");
//            dataSource.setPassword("feiji");
//            // 最大活跃链接数
//            dataSource.setMaxActive(2);
//            // 关闭空闲的链接（毫秒，默认1分钟）
//            dataSource.setTimeBetweenEvictionRunsMillis(5000);
//
////            // 获取连接时最长等待的时间
//            dataSource.setMaxWait(6000);
//
//
//            // 自动关闭长时间没有关闭的链接，很耗费性能，查看内存泄漏时候再开
////             打开removeAbandoned功能
//            dataSource.setRemoveAbandoned(true);
////             设置监控链接时间（秒）
//            dataSource.setRemoveAbandonedTimeout(5);
//            // 设置监控链接时间（毫秒）
////            dataSource.setRemoveAbandonedTimeoutMillis(5000);
//            // 关闭abanded连接时输出错误日志
////            dataSource.setLogAbandoned(true);
//
//            List<Filter> filters = new ArrayList<>();
//            filters.add(logFilter());
//            dataSource.setProxyFilters(filters);
//
//
//
//
//            try {
//                dataSource.setFilters("stat");
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    @Bean
//    public static Slf4jLogFilter logFilter(){
//        Slf4jLogFilter logFilter = new Slf4jLogFilter();
//        logFilter.setResultSetLogEnabled(false);
//        logFilter.setConnectionLogEnabled(false);
//        logFilter.setStatementParameterClearLogEnable(false);
//        logFilter.setStatementCreateAfterLogEnabled(false);
//        logFilter.setStatementCloseAfterLogEnabled(false);
//        logFilter.setStatementParameterSetLogEnabled(false);
//        logFilter.setStatementPrepareAfterLogEnabled(false);
//        return logFilter;
//    }
//
//    public static void getData(Connection conn) {
//        try {
//            System.out.println(conn.getCatalog());
//            System.out.println(conn);
//            String sql = "select top 10 iD,New_name,create_Time from userTest where id > ? order by id desc ; ";
//            PreparedStatement preparedStatement = conn.prepareStatement(sql);
//            preparedStatement.setObject(1, 2000);
//            ResultSet resultSet = preparedStatement.executeQuery();
//            JSONArray ja = new JSONArray();
//            JSONObject jo;
//            ResultSetMetaData data = resultSet.getMetaData();
////            log.info(JSON.toJSONString(data));
//            while (resultSet.next()) {
//                jo = new JSONObject();
//                jo.put("id", resultSet.getInt("id"));
//                jo.put("name", resultSet.getString("new_name"));
//                jo.put("create_time", resultSet.getDate("create_time"));
//                ja.add(jo);
//            }
////            conn.close();
//            resultSet.close();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    public static int timer = 0;
//
//    public static void showInfo() {
//        Executors.newSingleThreadExecutor().submit(
//                (Runnable) () -> {
//                    while (true) {
//                        infoDataSource();
//                        try {
//                            Thread.sleep(1000);
//                            System.out.println("timer:" + timer++);
//                        } catch (InterruptedException e) {
//                            e.printStackTrace();
//                        }
//                    }
//                }
//        );
//    }



}
